
#ifndef ORG_WXW0303_SYMBOL_DB_FILEPATH_UTIL_H_
#define ORG_WXW0303_SYMBOL_DB_FILEPATH_UTIL_H_

#include <string>

/**
 * 工具类,用于路径处理.
 * 相对路径;若 path[0] != '/',则表明 path 是相对路径;否则是绝对路径.
 * component;表示路径串中的一个组成部分.
 */
struct PathUtil {

    /**
     * 解析路径 path;返回一个处理结果,处理结果一定是绝对路径,并且不带有任何符号链接,以及多余
     * 的'/',并且不带有任何 '.','..';而且不带有末尾'/'.
     */
    static std::string realpath(const char *path);
    /// 等同于 realpath(path,rel);只不过将处理后的结果追加到 buf 之后.
    static void realpath(std::string &buf,const char *path);

    /**
     * 返回 path 对应的绝对路径,并且不带末尾'/'.
     * 若 path 是绝对路径,则直接返回 path;否则表明 path 相对于 rel;若 rel 为 NULL,则表明
     * path 相对于当前工作目录.
     */
    static std::string absolute(const char *path,const char *rel);
    static void absolute(std::string &buf,const char *path,const char *rel);

    /// 判断 path 是否是绝对路径.
    static inline bool isAbsolute(const char *path) noexcept;
    /// 获取当前工作目录,返回值一定是绝对路径,并且不带末尾'/'.
    static std::string getcwd();
    static void getcwd(std::string &buf);

    /// 仅当 path 存在并且为目录时,才会返回真.如果 path 为符号链接,则测试 path 引用的路径.
    static bool isDir(const char *path);

    /// 从 path 中读取符号链接文件的内容,并追加到 buf 中.
    static void readlink(std::string &buf,const char *path);
    static std::string readlink(const char *path);
};

inline bool
PathUtil::isAbsolute(const char *path) noexcept
{
    return path[0] == '/';
}

#endif // ORG_WXW0303_SYMBOL_DB_FILEPATH_UTIL_H_
